package patterns.singleton.core;

public class Singleton {
	@SuppressWarnings("unused")
	private static Singleton singleton = null;
	private Singleton(){
		
	}
	
	/**
	 * 在多线程下并不能保证单例
	 * @return
	 */
//	public static Singleton getInstance(){
//		if (singleton==null) {
//			singleton = new Singleton();
//		}
//		return singleton;
//	}
	
	/**
	 * 加锁，保证绝对的单例，性能太低
	 * @return
	 */
//	synchronized public static Singleton getInstance(){
//		if (singleton==null) {
//			singleton = new Singleton();
//		}
//		return singleton;
//	}
	
	/**
	 * 只有第一次调用该方法时才会进入代码块锁，改善性能
	 * @return
	 */
	/*public static Singleton getInstance(){
		if (singleton==null) {
			synchronized (singleton){
				singleton = new Singleton();
			}
			
		}
		return singleton;
	}*/
	
	/**
	 * JVM内部的机制能够保证当一个类被加载的时候，这个类的加载过程是线程互斥的
	 * 当第一次对象创建失败时，将再也得不到对象
	 * @return
	 */
	public static Singleton getInstance(){
		return SingletonFactory.instance;
	}
	
	private static class SingletonFactory{
		private static Singleton instance = new Singleton();
	}
}
